// interface 和 type 相类似，但并不安全一致
interface Person {
	// readonly name: string   // readonly 表示此属性只读，不可修改它的值
	name: string
	age?: number // ？问号表示此属性可选
	[propName: string]: any // 表示可以有其他属性字段，只要保证属性的名字为string，属性值为any类型就可以了，下面传入自变量的形式就不会报错了
	say(): string
}

type Person1 = {
	name: string
}
type Person2 = string // type可以直接代表基础类型，interface不行
const a: Person2 = '1'

const getPersonName = (person: Person): void => {
	console.log(person.name)
}
const setPersonName = (person: Person, name: string): void => {
	person.name = name
}
const person = {
	name: 'yee',
	sex: 'male',
	say: () => {
		return 'say hello'
	},
}
getPersonName(person)
setPersonName(person, 'yuan')

getPersonName(person)
// getPersonName({
//   name: 'yee',
//   sex: 'male'
// })   直接传自变量进去，会触发typescript的强校验，报错
getPersonName({
	name: 'yee',
	sex: 'male',
	say: () => {
		return 'say hello'
	},
})

//一个类想使用接口进行属性约束的时候，使用implements字段
class User2 implements Person {
	[propName: string]: any
	age: number
	name = 'yee'
	say() {
		return 'hello'
	}
}
// 使用interface定义函数类型
interface SayHi {
	(word: string): string
}
const say: SayHi = (words: string) => {
	return words
}

// 接口的继承使用extends字段
interface Teacher2 extends Person {
	teach(): string
}
const setPersonName2 = (person: Teacher2, name: string): void => {
	person.name = name
}
const person2 = {
	name: 'yee',
	say: () => {
		return 'say hello'
	},
	teach: () => {
		return 'xxx'
	},
}
setPersonName2(person2, 'yee')

//interface 和 type在编译生成js文件之后并不存在，是ts用来做语法校验
